Die mscJNeuralNet-API ist eine pure 100% Java API für vorwärtsgerichtete,
mehrschichtige künstliche Neuronale Netze
(Multilayered Feedforward-Nets, Multilayered Perceptrons - MLP).
Zusätzlich zu den eigentlichen Netzkomponenten enthält die API auch
einige grafische Komponenten zur Steuerung und Darstellung des Netzes.
1. Erzeugen der benötigten Klassen
MLP Net
INetConnector
für Initialisierung des MLP
INetTrainingAlgorithm
zum Trainieren des MLP
2. Initialisieren des Netzes
MLP + INetConnector
3. Trainieren des Netzes
TRAININGSDATEN
Lernverfahren mit Netz verbinden
50 TRAININGSZYKLEN
Berechnen der aktuellen Netzperformanz (Soll-Ist Fehler)
Formatierte Ausgabe der Netzperformanz
package mscJNeuralNet.tests;
import mscJNeuralNet.netPerformanceStatistics.NetPerformanceReporter;
import mscJNeuralNet.connectors.INetConnector;
import mscJNeuralNet.connectors.RandomSymmetryBreakingNetConnector;
import mscJNeuralNet.net.Net;
import mscJNeuralNet.netPerformanceStatistics.NetPerformanceStatistics;
import mscJNeuralNet.netPerformanceStatistics.NetPerformanceStatisticsCalculator;
import mscJNeuralNet.net.PatternDoesNotMatchNetException;
import mscJNeuralNet.trainingAlgorithms.INetTrainingAlgorithm;
import mscJNeuralNet.trainingAlgorithms.RProp;
// Trainieren eines MLP
public class TestTrippleXorLearn{
public static void main(String argv[]){
// 1. Erzeugen der benötigten Klassen
// MLP Net
// MLP mit der gewünschten Schichtstruktur erstellen:
// Eingabeschicht: 3 Neuronen
// 1. Verdeckte Schicht: 3 Neuronen
// Ausgabeschicht: 1 Neuron
int [] layerSizesTrippleXOr = {3, 3, 1};
//* Net
myNet = new Net(layerSizesTrippleXOr);
Net myNet = new Net(layerSizesTrippleXOr);
// BIAS wurde automatisch berücksichtigt.
// INetConnector
// Diese Klasse wird zum Initialisieren der Kantengewichte benötigt
INetConnector lNetConnectionAlgo = new RandomSymmetryBreakingNetConnector();
// INetTrainingAlgorithm
// Diese Klasse wird zum Trainieren eines MLP benötigt
INetTrainingAlgorithm lNetTrainAlgo = new RProp();
// 2. Initialisieren des Netzes
// MLP + INetConnector
// Mit der Instanz von INetConnector
inititalisieren.
// Die Klasse RandomSymmetryBreakingNetConnector
benötigt
// keine eigenen Kontrollparameter und wird daher mit dem Wert null aufgerufen.
lNetConnectionAlgo.connectNet(myNet, null);
// Nun ist das Netz verbunden und initialisiert.
// 3. Trainieren des Netzes
// TRAININGSDATEN
// Trainingsdaten bereitstellen
double [][] lTrippleXORtrainInput = {
{-1,-1,-1}, {-1,-1,1},
{-1,1,-1}, {-1,1,1},
{1,-1,-1}, {1,-1,1},
{1,1,-1}, {1,1,1}};
double [][] lTrippleXORtrainOutput = {
{-1},{1},
{1},{-1},
{1}, {-1},
{-1}, {1}};
// MLP + INetTrainingAlgorithm
// Lernverfahren INetTrainingAlgorithm
mit Netz verbinden.
lNetTrainAlgo.setNet(myNet);
try{
// 50 TRAININGSZYKLEN
while (lNetTrainAlgo.getCycle()<50){
Net.train(lTrippleXORtrainInput, lTrippleXORtrainOutput, lNetTrainAlgo);
}
// NetPerformanceStatisticsCalculator
// NetPerformanceStatistics
// Berechnen der aktuellen Netzperformanz (Soll-Ist Fehler)
NetPerformanceStatistics lNetPerformance =
NetPerformanceStatisticsCalculator.calculateErrors(
myNet, lTrippleXORtrainInput, lTrippleXORtrainOutput);
// NetPerformanceReporter
// Formatierte Ausgabe der Netzperformanz
NetPerformanceReporter.getNetPerformance(
lNetPerformance, lNetTrainAlgo.getCycle());
}
catch(PatternDoesNotMatchNetException
e){
// Wird aufgerufen, wenn die Lerndatensätze mehr Eingabe-/Ausgabewerte
// enthalten als Eingabe-/Ausgabeneuronen im MLP vorhanden sind.
e.printStackTrace();
}
}
}
Für eine anspruchsvollere Verwaltung des Lernvorgangs steht die Klasse
NetTrainer
zur Verfügung, die u.a. trainieren
mehrerer Zyklen als nebenläufigen Prozess oder trainieren der Lerndaten in zufälliger Reihenfolge
unterstützt.